% TP 3, EJ 1

puntajes( hernan, [3,5,8,6,9] ).
puntajes( julio, [9,7,3,9,10,2] ).
puntajes( ruben, [3,5,3,8,3] ).
puntajes( roque, [7,10,10] ).

% (A)
puntaje( Pers, Salto, Punt ) :- puntajes( Pers, Lista ), busca( Lista, Salto, Punt ).

busca( [P|_], 1, P ).
busca( [_|R], Salto, Punt ) :- Sig is Salto-1, busca( R, Sig, Punt ).

/*
	puntaje( hernan, 5, Puntos ). --> Puntos = 9
	puntaje( ruben, 4, Puntos ). --> Puntos = 8
	puntaje( ruben, 1, Puntos ). --> Puntos = 3
	puntaje( ruben, 0, Puntos ). --> No
*/

% (B)
descalificado( Pers ) :- puntajes( Pers, Lista ), length( Lista, Saltos ), Saltos > 5.

/*
	descalificado( Nombre ). --> Nombre = julio
*/

% (C)
finalista( Pers ) :- puntajes( Pers, Lista ), puntaje_apto( Lista ).
% Suma mas de 28
puntaje_apto( Lista ) :- sumlist( Lista, Sum ), Sum >= 28, !.
% O tiene al menos 2 puntajes >= 8
puntaje_apto( Lista ) :- puntaje_alto( Lista, 2 ).

% Llego el contador a 0, hay al menos 2, finalista
puntaje_alto( _, 0 ) :- !.
% Se termino la lista, fallo
puntaje_alto( [], _ ) :- fail.
puntaje_alto( [P|R], N ) :- ( P >= 8, M is N-1; M is N ), puntaje_alto( R, M ).

/*
	finalista( Nombre ). --> Nombre = hernan; Nombre = julio; Nombre = roque
*/